JSON WEB TOKEN

JSON WEB TOKEN简称为JWT,是一个基于JSON的开放标准,用于通信双方之间传递安全信息的简洁的、URL安全的表述性声明规范,经常用于身份验证。

结构

JWT有三部分组成,他们之间用.分隔,这三部分分别是HeaderPayloadSignature,结构如下:

Header.Payload.Signature

jwt.io给予的实例

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

对于这个例子,其三部分组成分别为

// header
{
  "alg": "HS256",
  "typ": "JWT"
}

// Payload
{
  "sub": "1234567890",
  "name": "John Doe",
  "iat": 1516239022
}

// Signature
HMACSHA256(
  base64UrlEncode(header) + "." +base64UrlEncode(payload),
  "your-256-bit-secret"
)

Header头部,其由两部分组成:声明类型和算法名称,在本例中的Token类型为jwt,加密算法为HMAC-SHA256。将Header进行BASE64URL算法编码,即可得到jwt的第一部分,注意BASE64URL算法编码与BASE64编码略有不同,BASE64URL需要将BASE64中输出中的+替换为减号-/替换为_,而且没有标准的BASE64填充,把=去掉。

base64UrlEncode({"alg": "HS256","typ": "JWT"}) === "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9";

Payload

Payload有效载荷,其为JWT的主体,这里可以存放主体数据信息,Payload包含三个部分,标准中注册的声明、公共的声明、私有的声明。

标准中注册的声明 (建议但不强制使用)

公共声明

可以在公共声明添加任何信息,我们一般会在里面添加用户信息和业务信息,但是不建议添加敏感信息,因为公共声明部分可以在客户端解密,除非此信息是加密的。

私有声明

私有声明是服务器和客户端共同定义的声明,同样这里不建议添加敏感信息。

base64UrlEncode({"sub": "1234567890","name": "John Doe","iat": 1516239022}) === "eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ";

Signature

Signature哈希签名,其通过JWTHeader定义的算法,将前两部分数据进行编码后哈希来生成签名,主要是确保数据不会被篡改。

HMACSHA256( base64UrlEncode(header) + "." +base64UrlEncode(payload),"your-256-bit-secret") === "SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c"

优点

缺点

相关

CSRF https://esther-fyy.pages.dev//blob/master/Browser/CSRF%E8%B7%A8%E7%AB%99%E8%AF%B7%E6%B1%82%E4%BC%AA%E9%80%A0.md
XSS https://esther-fyy.pages.dev//blob/master/Browser/XSS%E8%B7%A8%E7%AB%99%E8%84%9A%E6%9C%AC%E6%94%BB%E5%87%BB.md
Cookie与Session https://esther-fyy.pages.dev//blob/master/HTML/Cookie%E4%B8%8ESession.md

参考

https://www.freebuf.com/vuls/219056.html
https://blog.csdn.net/qq_28165595/article/details/80214994